home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 05 - 1989 / 05.08 Aug 89 / POOPDraw Code ƒ / OBJT TextBox.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-13  |  7.4 KB  |  309 lines  |  [TEXT/KAHL]

  1.  
  2. /********************************************************************/
  3. /*                        SOURCE CODE FILE                            */
  4. /********************************************************************/
  5. /*
  6. *   >>>    File name:        TextObject.c    
  7. *
  8. *      >>>    Purpose:        Methods for Text Object
  9. *     >>>    Project:        PoopDraw    Version 1        
  10. *     >>>    Date:            2/20/89
  11. *      >>>    By:                Adam Treister
  12. *
  13. */
  14. /********************************************************************/
  15. /*    For Your Information            1802 Hillside Rd. SB CA 93101    */
  16. /********************************************************************/
  17.  
  18. #include "PoopDrawInc"
  19.  
  20. /***** Object Type Defs *********************************************/
  21.  
  22. typedef struct
  23. {
  24.     _StdObjectFields
  25.     Boolean         frameIt;
  26.     TEHandle         teH;
  27.     
  28. }    TextObjectRec,*TextObjectPtr,**TextObjectHandle;
  29.  
  30. /***** Public Functions *********************************************/
  31.  
  32. ObjectHandle NewTextObj(LPtr ParmP);
  33.  
  34. /***** Private Functions ********************************************/
  35.  
  36. private    void ObjDispatch(TextObjectHandle ObjectH,int Message,LPtr InParmP);
  37. private    void Dispose(TextObjectHandle ObjectH);
  38. private    void Duplicate(TextObjectHandle ObjectH, LPtr OutParmP);
  39. private    void Draw(TextObjectHandle ObjectH);
  40. private    void MouseDown(TextObjectHandle ObjectH);
  41. private    void KeyDown(TextObjectHandle ObjectH);
  42. private    void Activate(TextObjectHandle ObjectH);
  43. private    void Deactivate(TextObjectHandle ObjectH);
  44. private    void Resize(TextObjectHandle ObjectH,LPtr ParmP);
  45. private    void Move(TextObjectHandle ObjectH,LPtr ParmP);
  46. private    void Pack(TextObjectHandle ObjectH,Handle h);
  47. private    void UnPack(TextObjectHandle ObjectH,Ptr *pP);
  48. private    void SetLength(TextObjectHandle ObjectH);
  49.  
  50. #define TEINSET 4
  51. /********************************************************************/
  52.  
  53.  
  54. void ObjDispatch(ObjectH,Message,ParmP)
  55. TextObjectHandle ObjectH;
  56. int Message;
  57. LPtr ParmP;
  58.  
  59. {
  60.     switch(Message)
  61.     {
  62.     
  63.         case DISPOSE:        Dispose(ObjectH);                break;
  64.         case DRAW:            Draw(ObjectH);                    break;
  65.         case MOUSEDOWN:        MouseDown(ObjectH);                break;
  66.         case KEYDOWN:        KeyDown(ObjectH);                break;
  67.         case ACTIVATE:        Activate(ObjectH);                break;
  68.         case DEACTIVATE:    Deactivate(ObjectH);            break;
  69.  
  70.         case CUT:            TECut((*ObjectH)->teH);            break;
  71.         case COPY:            TECopy((*ObjectH)->teH);        break;
  72.         case PASTE:            TEPaste((*ObjectH)->teH);        break;
  73.  
  74.         case IDLE:            TEIdle((*ObjectH)->teH);        break;
  75.  
  76.          case RESIZE:        Resize(ObjectH,ParmP);            break;
  77.         case MOVE:            Move(ObjectH,ParmP);            break;
  78.         case SETLEN:        SetLength(ObjectH);                break;
  79.         case PACK:            Pack(ObjectH,ParmP);            break;
  80.         case UNPACK:        UnPack(ObjectH,ParmP);            break;
  81.  
  82.          case FILL:    
  83.         case PENPAT:
  84.         case PENSIZE:        /* ignore */                    break;
  85.  
  86.         default:    DrawObjectDispatch(ObjectH,Message,ParmP);
  87.     }
  88. }    
  89. /*-------------------------------------------NEW-----------------*/
  90.  
  91. ObjectHandle NewTextObj(ParmP)
  92. LPtr ParmP;
  93. {
  94.     TextObjectHandle obj;
  95.     Rect r;
  96.     
  97.     r = *(Rect *)ParmP;
  98.     SortRect(&r);
  99.     if (EmptyRect(&r))    return(NULL);
  100.  
  101.     obj = _GetHandleToRecord(TextObjectRec);
  102.     NullOutHandle(obj);
  103.     (*obj)->dispatch = ObjDispatch;
  104.     FrameRect(&r);
  105.     InsetRect(&r,TEINSET,TEINSET);
  106.     (*obj)->teH = TENew(&r,&r);
  107.     (*obj)->class = TEXT;
  108.     (*obj)->frameIt = TRUE;
  109.     BitSet(&(*obj)->attributes,VisibleBit);    
  110.     (*obj)->port = MyFrontWindow();
  111.     (*obj)->bounds = r;
  112.     Dispatch(obj,INVAL,NULL);
  113.     WDispatch((*obj)->port,SETACTIVETEXT,obj);
  114.  
  115.     return((ObjectHandle)obj);
  116. }
  117.  
  118.  
  119. /*---------------------------------Dispose-----------*/
  120.  
  121. void Dispose(ObjectH)
  122. TextObjectHandle ObjectH;
  123. {
  124.     TEDispose((*ObjectH)->teH);
  125.     WDispatch((*ObjectH)->port,CLRACTIVETEXT,NULL);
  126.     DisposeHandle(ObjectH);
  127. }
  128. /*----------------------------------Draw--------------*/
  129.  
  130. void Draw(ObjectH)
  131. TextObjectHandle ObjectH;
  132. {
  133.     if (BitTst(&(*ObjectH)->attributes,VisibleBit))
  134.     {
  135.             WindowPtr wP;
  136.             int tool;
  137.         wP = (*ObjectH)->port;
  138.  
  139.         EraseRect(&(*ObjectH)->bounds);
  140.         TEUpdate(&(*ObjectH)->bounds,(*ObjectH)->teH);
  141.         if ((*ObjectH)->frameIt)
  142.         {
  143.             PenNormal();
  144.             FrameRect(&(*ObjectH)->bounds);
  145.         }
  146.         if (BitTst(&(*ObjectH)->attributes,SelectedBit))
  147.         {        Dispatch(SELF,DRAWHANDLES,NULL);
  148.         }
  149.     }
  150. }
  151.  
  152. /*----------------------------------MouseDown--------*/
  153.  
  154. void MouseDown(ObjectH)
  155. TextObjectHandle ObjectH;
  156. {
  157.     extern EventRecord Event;
  158.     Point pt;
  159.     WindowPtr wP;
  160.     long curTool;
  161.     Rect r;
  162.     
  163.     wP = (*ObjectH)->port;
  164.     WDispatch(wP,GETTOOL,&curTool);
  165.     WDispatch(wP,SETACTIVETEXT,ObjectH);
  166.     
  167.     pt = Event.where;
  168.     GlobalToLocal(&pt);
  169.     r = (*ObjectH)->bounds;
  170.     InsetRect(&r,TEINSET,TEINSET);
  171.     if ((curTool == TEXT) AND PtInRect(pt,&r))
  172.     {
  173.         TEClick(pt, _ShiftKeyDown(Event),(*ObjectH)->teH);
  174.     }
  175.     else DrawObjectDispatch(ObjectH,MOUSEDOWN,NULL);
  176.     
  177.  
  178. }
  179. /*----------------------------------KeyDown-----*/
  180.  
  181. void KeyDown(ObjectH)
  182. TextObjectHandle ObjectH;
  183. {
  184.     extern EventRecord Event;
  185.             char theChar;
  186.             
  187.     theChar = Event.message & charCodeMask;
  188.     TEKey(theChar,(*ObjectH)->teH);
  189. }
  190. /*------------------------------Activate------------*/
  191.  
  192. void Activate(ObjectH)
  193. TextObjectHandle ObjectH;
  194. {
  195.          TEActivate((*ObjectH)->teH);
  196. }        
  197. /*---------------------------Deactivate--------------*/
  198.  
  199. void Deactivate(ObjectH)
  200. TextObjectHandle ObjectH;
  201. {
  202.          TEDeactivate((*ObjectH)->teH);
  203. }
  204. /*---------------------------Resize-----------------*/
  205.  
  206. void Resize(ObjectH,ParmP)
  207. TextObjectHandle ObjectH;
  208. LPtr ParmP;
  209. {
  210.             register TEHandle teH;
  211.             Rect r;
  212.             
  213.     r = *(Rect *)ParmP;
  214.     (*ObjectH)->bounds = r;
  215.     InsetRect(&r,TEINSET,TEINSET);
  216.     teH = (*ObjectH)->teH;
  217.     (*teH)->destRect = (*teH)->viewRect = r;
  218.     TECalText(teH);
  219.     Dispatch(ObjectH,INVAL,NULL);
  220. }
  221. /*----------------------------Move------------------*/
  222.  
  223. void Move(ObjectH,ParmP)
  224. register TextObjectHandle ObjectH;
  225. LPtr ParmP;
  226.  
  227. {
  228.     int dh,dv;
  229.     TEHandle teH = (*ObjectH)->teH;
  230.     
  231.     if (*ParmP == 0x8000) return;
  232.     dv = HiWord(*ParmP);    dh =  LoWord(*ParmP);    
  233.     Dispatch(ObjectH,INVAL,NULL);
  234.     OffsetRect(&(*ObjectH)->bounds,dh,dv);
  235.     OffsetRect(&(*teH)->destRect,dh,dv);
  236.     OffsetRect(&(*teH)->viewRect,dh,dv);
  237.     Dispatch(ObjectH,INVAL,NULL);
  238. }
  239. /*----------------------------------------------------------*/
  240. /*    Here is a sleazy shortcut.  Rather than saving all of 
  241.     text edits params, I extract the text to a Str255 
  242.     (truncating any chars after 255) and save only the string. 
  243.      Not too tubular, dude.
  244.      
  245.     SetLength, Pack and UnPack all operate on that assumption
  246. /*----------------------------------------------------------*/
  247. #define SKIP1FLD 4
  248. #define SKIP3FLDS 12
  249. /*------------------------------SetLength----------------*/
  250.  
  251. void SetLength(ObjectH)
  252. TextObjectHandle        ObjectH;
  253. {
  254.     (*ObjectH)->length = GetHandleSize(ObjectH) - SKIP3FLDS + 256;
  255. }
  256. /*-------------------------------Pack----------------------*/
  257. void Pack(ObjectH,h)
  258. TextObjectHandle        ObjectH;
  259. Handle h;    
  260. {
  261.         Size size;
  262.         Ptr p;
  263.         long nBytes;
  264.         TEHandle teh;
  265.         Str255 str;
  266.         Rect r;
  267.     
  268.     size = GetHandleSize(h);
  269.     SetHandleSize(h,size + (*ObjectH)->length);        MEM_CHECK
  270.     nBytes = (*ObjectH)->length - 256;
  271.     HLock(h);
  272.  
  273.     p = *h + size;        /* move to end of existing handle */
  274.     BlockMove(&(*ObjectH)->class,p,nBytes); 
  275.     p += nBytes;
  276.     teh = (*ObjectH)->teH;
  277.     TEGetString(teh,str);
  278.     StrCopy(str,p);
  279.  
  280.     HUnlock(h);
  281. }
  282. /*------------------------------UnPack----------------*/
  283. void UnPack(ObjectH,pP)
  284. TextObjectHandle ObjectH;
  285. Ptr *pP;    
  286. {
  287.         Size obSize;
  288.         IPtr ip = *pP;
  289.         Ptr p;
  290.         long nBytes;
  291.         TEHandle teh;
  292.         Str255 str;
  293.         Rect r;
  294.              
  295.     (*ObjectH)->class = *ip++;
  296.     (*ObjectH)->length = *ip++;                
  297.     nBytes = (*ObjectH)->length - 256;
  298.     BlockMove(*pP,&(*ObjectH)->class,nBytes);    
  299.     r = (*ObjectH)->bounds;
  300.     InsetRect(&r,TEINSET,TEINSET);
  301.     teh = (*ObjectH)->teH;
  302.     (*teh)->destRect =     (*teh)->viewRect = r;
  303.     p = *pP + nBytes;
  304.     StrCopy(p,str);
  305.     TESetString(teh,str);
  306.     *pP += (*ObjectH)->length;
  307.     
  308. }
  309.